package br.com.cnpv.modelo.bo;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.cnpv.modelo.acesso.idao.IClienteDAO;
import br.com.cnpv.modelo.acesso.idao.IEventoDAO;
import br.com.cnpv.modelo.acesso.idao.IOficinaDAO;
import br.com.cnpv.modelo.acesso.idao.IVeiculoClienteDAO;
import br.com.cnpv.modelo.acesso.idao.IVeiculoDAO;
import br.com.cnpv.modelo.acesso.idao.IVistoriaEventoDAO;
import br.com.cnpv.modelo.dao.ClienteDAO;
import br.com.cnpv.modelo.dao.EventoDAO;
import br.com.cnpv.modelo.dao.OficinaDAO;
import br.com.cnpv.modelo.dao.VeiculoClienteDAO;
import br.com.cnpv.modelo.dao.VeiculoDAO;
import br.com.cnpv.modelo.dao.VistoriaEventoDAO;
import br.com.cnpv.modelo.entity.Cliente;
import br.com.cnpv.modelo.entity.Evento;
import br.com.cnpv.modelo.entity.Oficina;
import br.com.cnpv.modelo.entity.Usuario;
import br.com.cnpv.modelo.entity.Veiculo;
import br.com.cnpv.modelo.entity.VeiculoCliente;
import br.com.cnpv.modelo.entity.VistoriaEvento;
import br.com.cnpv.util.HibernateUtil;

public class EventoBO extends HibernateUtil
{
	public static EventoBO INSTANCE;
	
	public static EventoBO getInstance()
	{
		if(INSTANCE == null)
		{
			synchronized (EventoBO.class) {
				INSTANCE = new EventoBO();
			}
		}
		
		return INSTANCE;
	}

	public Evento saveOrUpdate(Evento evento, Cliente cliente, Oficina oficina, Veiculo veiculo, Usuario usuario) throws Exception
	{
		Session session = null;
		Transaction transaction = null;
		try
		{
			session = currentSession();
			transaction = session.beginTransaction();
			
			//dao
			IClienteDAO clienteDAO = new ClienteDAO();
			IVeiculoDAO veiculoDAO = new VeiculoDAO();
			IOficinaDAO oficinaDAO = new OficinaDAO();
			IEventoDAO eventoDAO = new EventoDAO();
			IVeiculoClienteDAO veiculoClienteDAO = new VeiculoClienteDAO();
			IVistoriaEventoDAO vistoriaEventoDAO = new VistoriaEventoDAO();
			
			cliente.setDtIncl(new Date());
			cliente.setIdUsuario(usuario.getId());
			cliente.setIdAssociacao(usuario.getIdAssociacao());
			cliente = clienteDAO.saveOrUpdate(cliente, session);
			evento.setIdCliente(cliente.getId());
			
			veiculo.setDtIncl(new Date());
			veiculo.setIdUsuario(usuario.getId());
			veiculo = veiculoDAO.saveOrUpdate(veiculo, session);
			
			VeiculoCliente veiculoCliente = new VeiculoCliente();
			veiculoCliente.setAtivo(true);
			veiculoCliente.setIdCliente(cliente.getId());
			veiculoCliente.setIdVeiculo(veiculo.getId());
			veiculoCliente.setDtIncl(new Date());
			veiculoCliente.setIdUsuario(usuario.getId());
			veiculoCliente = veiculoClienteDAO.saveOrUpdate(veiculoCliente, session);
			evento.setIdVeiculoCliente(veiculoCliente.getId());
			
			oficina.setDtIncl(new Date());
			oficina.setIdUsuario(usuario.getId());
			oficina = oficinaDAO.saveOrUpdate(oficina, session);
			evento.setIdOficina(oficina.getId());
			
			evento.setDtIncl(new Date());
			evento.setIdUsuario(usuario.getId());
			
			String codigo = "";
			GregorianCalendar calendar = new GregorianCalendar();
			calendar.setTime(new Date());
			int ano = calendar.get(Calendar.YEAR);
			
			int totalEvento = eventoDAO.obtemTotal(usuario, ano, session);
					
			codigo = cliente.getIdTipoCliente()+"-"+usuario.getIdAssociacao()+"-"+totalEvento+"-"+ano;
			
			evento.setCodigoEvento(codigo);
			evento.setIdAssociacao(usuario.getIdAssociacao());
			evento = eventoDAO.saveOrUpdate(evento, session);
			transaction.commit();
			
			transaction = session.beginTransaction();
			
			// Gerar vistoria pendente
			VistoriaEvento vistoriaEvento = new VistoriaEvento();
			vistoriaEvento.setIdEvento(evento.getId());
			vistoriaEvento.setIdTipoVistoria(1);
			vistoriaEvento.setIdUsuario(usuario.getId());
			vistoriaEvento.setDtIncl(new Date());
			vistoriaEvento = vistoriaEventoDAO.saveOrUpdate(vistoriaEvento, session);
			transaction.commit();
			
			
			// Disparar EMAILS
			
			
		}catch(Exception e)
		{
			transaction.rollback();
			throw new Exception(e);
		}finally
		{
			if(session != null)
			{
				session.flush();
				session.clear();
			}
			closeSession();
		}
		
		return evento;
	}
}